/* 
 * Questa interfaccia contiene la lista di funzionalità astratte di cui la
 * logica business dell'applicazione necessita per manipolare i dati e
 * realizzare le operazioni richieste
 * 
 * This interface contains the list of abstract funcionalities that the
 * application business logic needs to manipulate the data
 * and perform its operations
 * 
 */

package it.univaq.f4i.iw.ex.album.model;

import java.util.List;

/**
 *
 * @author Giuseppe Della Penna
 */
public interface PhotoAlbumDataLayer {

    //metodi factory per gli oggetti del data model
    //factory methods to create data model object instances
    Photo createPhoto();

    Album createAlbum();

    Comment createComment();

    User createUser();

    //restituisce la foto identificata tramite la sua chiave
    //returns the photo with the given key
    Photo getPhoto(int key);

    //restituisce la lista delle foto aventi hint all'interno del titolo
    //returns the photos having the given hint in their title
    List<Photo> getPhotoByTitle(String hint);

    //restituisce le foto presenti nell'album
    //returns the photos in a given album
    List<Photo> getPhotoByAlbum(Album album);

    //aggiunge una foto. Restituisce la foto così com'è stata immagazzinata (ed esempio con campi calcolati).
    //adds a photo to the data storage and returns the photo as it is now stored (e.g., with calculated fields)
    Photo addPhoto(Photo photo);

    //cancella la foto
    //deletes a photo from the data storage
    Photo deletePhoto(Photo photo);

    //aggiorna la foto identificata tramite la sua chiave con i parametri dati
    //updates the given photo in the data storage using the current object attributes
    Photo updatePhoto(Photo photo);

    //restituisce l'album identificato tramite la sua chiave
    //returns the album with the given key
    Album getAlbum(int key);

    //restituisce la lista degli Album del propietario indicato
    //returns tha albums with the given owner
    List<Album> getAlbumsByUser(User owner);

    //aggiunge un album
    //adds and album to the data storage
    Album addAlbum(Album album);
    
    //aggiorna un album
    //updates the given album in the data storage
    Album updateAlbum(Album album);

    //cancella un album
    //deletes an album from the data storage
    Album deleteAlbum(Album album);

    //restituisce il commento indicato tramite le sua chiave
    //returns the comment given its key
    Comment getComment(int key);

    //restituisce la lista dei commenti per la foto indicata
    //returns the list of comments associated with a given photo
    List<Comment> getCommentsByPhoto(Photo photo);

    //aggiunge un commento
    //adds a comment to the data storage
    Comment addComment(Comment comment);

    //aggiorna un commento
    //updates the given comment in the data storage
    Comment updateComment(Comment comment);

    //cancella un commento
    //deletes a comment from the data storage
    Comment deleteComment(Comment comment);

    //restituisce i dati dell'utente indicato tramite le sua chiave
    //returns the user with the given key
    User getUser(int key);

    //aggiunge un utente
    //adds an user to the data storage
    User addUser(User user);

    //aggiorna un utente
    //updates the given user in the data storage
    User updateUser(User user);

    //cancella un utente
    //deletes the given user form the data storage
    User deleteUser(User user);
}
